// base64
function base64ImgtoFile (dataurl, filename = 'file') {
  //将base64格式分割：['data:image/png;base64','XXXX']
  const arr = dataurl.split(',')
  // .*？ 表示匹配任意字符到下一个符合条件的字符 刚好匹配到：
  // image/png
  const mime = arr[0].match(/:(.*?);/)[1]  //image/png
  //[image,png] 获取图片类型后缀
  const suffix = mime.split('/')[1] //png
  const bstr = atob(arr[1])   //atob() 方法用于解码使用 base-64 编码的字符串
  let n = bstr.length
  const u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new File([u8arr], `${filename}.${suffix}`, {
    type: mime
  })
}

// 图片压缩
function resizeImg(file, callback, size = 0.77){
  // 压缩图片需要的一些元素和对象
  const reader = new FileReader();
  const img = new Image();

  reader.readAsDataURL(file);
  // 文件base64化，以便获知图片原始尺寸
  reader.onload = function (e) {
    img.src = e.target.result;
  };

  // base64地址图片加载完毕后执行
  img.addEventListener('error' , function(e){
    //window.alert('image-src:图片无法加载.')
  })

  img.addEventListener('load' , function(){
    // 缩放图片需要的canvas（也可以在DOM中直接定义canvas标签，这样就能把压缩完的图片不转base64也能直接显示出来）
    const canvas = document.createElement('canvas');
    const context = canvas.getContext('2d');
    // 图片原始尺寸
    const originWidth = this.width;
    const originHeight = this.height;
    // 最大尺寸限制，可通过设置宽高来实现图片压缩程度
    const maxWidth = 1800;
    const maxHeight = 1800;
    // 目标尺寸
    let targetWidth = originWidth;
    let targetHeight = originHeight;
    // 图片尺寸超过300x300的限制
    if (originWidth > maxWidth || originHeight > maxHeight) {
      if (originWidth / originHeight > maxWidth / maxHeight) {
        // 更宽，按照宽度限定尺寸
        targetWidth = maxWidth;
        targetHeight = Math.round(maxWidth * (originHeight / originWidth));
      } else {
        targetHeight = maxHeight;
        targetWidth = Math.round(maxHeight * (originWidth / originHeight));
      }
    }
    // canvas对图片进行缩放
    canvas.width = targetWidth;
    canvas.height = targetHeight;
    // 清除画布
    context.clearRect(0, 0, targetWidth, targetHeight);
    // context.fillStyle = 'rgba(0, 0, 0, 0)';
    // context.fillRect(0, 0, targetWidth, targetHeight);
    // 图片压缩
    context.drawImage(img, 0, 0, targetWidth, targetHeight);
    /* 第一个参数是创建的img对象；第二三个参数是左上角坐标，后面两个是画布区域宽高 */
    // 压缩后的图片转base64 url
    /* canvas.toDataURL(mimeType, qualityArgument),mimeType 默认值是'image/png'; */
    const newUrl = canvas.toDataURL('image/jpeg', size); // base64 格式
    // 也可以把压缩后的图片转blob格式用于上传
    callback(newUrl);
  } , false);

}


export default function(_){
  // 添加base64头
  _.headBase64 = (data)=>{
    return /^data/.test(data)?data:("data:image/png;base64,"+data);
  }
  // 压缩后base64
  _.zipImg = (file)=>new Promise((resolve)=>{
    if(file.size > 150 * 1000){
      resizeImg(file,resolve)
    }else{
      resolve(URL.createObjectURL(file))
    }
  })
  // 压缩后file
  _.zipImgFile = function(file){
    return new Promise((resolve)=>{
      if(file.size > 1.1 * 1000 * 1000){
        resizeImg(file,(data)=>resolve(base64ImgtoFile(data)))
      }else{
        resolve(file)
      }
    })
  }

  // base64编码
  _.btoa = function(file){
    return new Promise((resolve,reject) => {
      const reader = new FileReader();
      reader.readAsDataURL(file);
      reader.onload = () => {
        const base64 = reader.result;
        resolve(base64);
      }
      reader.onerror = error => reject(error);
    });
  }
  // base64解码
  _.atob = function(base64Data){
    return new Promise((resolve)=>{
      const blob = base64ImgtoFile(base64Data)
      const blobUrl = window.URL.createObjectURL(blob);
      resolve(blobUrl);
    })
  }
}
